/**********************************************************************************\
** 文件名称: VS1838.h
** 创建人员: YCG
** 创建日期: 2017-11-1
** 文档描述:
** 版本代号: V0.1
** 版本说明: 初始版本
\********************************************************************************/
#ifndef __V_S1838_H_
#define __V_S1838_H_

#include	"main.h"

//#define VS1838_DEBUG
#ifdef  VS1838_DEBUG
#include "uart.h"
#define  VS1838_Printf(fmt,...)   Uprintf(fmt,__VA_ARGS__)
#else
#define  VS1838_Printf(...)
#endif
/********************接收状态********************/
#define IR_START    0
#define IR_START_L  1
#define IR_START_H  2
#define IR_BEGIN    3
#define IR_READ     4
#define IR_END      5

/********************引脚的电平********************/
#ifndef HIGH
#define HIGH 1
#define LOW  0
#endif
/********************编码类型********************/
#define IR_NEC 0
#define IR_KANGJIA 1

/********************求取范围相关的定义********************/
#define  SET_RANG(mid,rang) {mid+rang,mid-rang}                //设置范围，mid为中心值，rang为范围
#define  IsInRang(dat,rang) (dat < rang.max && dat > rang.min) //判断是否在范围以内

struct IR_struct_s;                      //因为相互包含，在这里先进行声明
typedef struct IR_struct_s IR_struct;

typedef void (*IR_CallBack) (IR_struct* );   //定义回调函数的类型

typedef union
{
    uint32_t Re32;      //结果的32位值
    uint8_t  Re8[4];   //结果的8位值，结构体
} IRResult_union;     //最后结果，联合体类型

typedef struct
{
    uint16_t max;     //最大值
    uint16_t min;     //最小值
} Rang16_struct;    //范围结构体

typedef struct
{
    char* name;                    //类型名称
    uint8_t type;                        //类型
    uint8_t BitNum;                      //位数
    Rang16_struct   StartLowTime;        //起始低电平时间    时间间隔大于它
    Rang16_struct   StartHighTime;       //起始高电平时间    时间间隔大于它
    Rang16_struct   ReStartHighTime;     //起始高电平时间    时间间隔大于它
    Rang16_struct   BitLowTime;          //位起始低电平时间  时间间隔小于它
    Rang16_struct   Bit0Time;            //信号0电平时间     时间间隔小于它
    Rang16_struct   Bit1Time;            //信号1电平时间     时间间隔小于它
    Rang16_struct   EndTime;             //结束电平时间
    Rang16_struct   Ctime;              //连续按的时间
} IRCode_struct;

struct IR_struct_s
{
    uint8_t   State;        //检测状态
    uint8_t   ReadBit;      //目前读取第几位
    uint8_t   LastPinValue; //上一次的引脚值
    //uint8_t   NowPinValue;  //本次的引脚值
    uint32_t  LastTime;     //上一次时间
    //uint32_t  NowTime;       //本次时间
    uint32_t  LastReadTime;  //上一次的时间
    uint32_t  LastRead;      //保留上一次的输出结果
    IRResult_union  Read;         //结果中间保存

    IRCode_struct const * Code;    //编码类型

    GPIO_TypeDef * Port;    //引脚端口
    uint32_t Pin;           //引脚

    uint8_t add;            //地址
    uint8_t dat;            //数据
    IR_CallBack DatDeal;    //接收完成时的回调函数
};

extern IR_struct IR1 ;

void IrInit(IR_struct* IR, GPIO_TypeDef * Port, uint32_t Pin, IR_CallBack deal);
void IrScan(IR_struct* IR, uint32_t time);

#endif
/********************************End of File************************************/
